篇首语:本文由编程笔记#小编为大家整理,主要介绍了matlab改进萤火虫算法求解路径优化VRP相关的知识,希望对你有一定的参考价值。
tic
clear
clc
%% 导入订单数据和各个储位物品的重量数据
load orders.mat orders
load item_weight.mat item_weight
%% 仓库参数初始化
depot_leftAisle=1.5; %仓库与第1条拣选通道的距离,1.5LU
enter_leave_aisle=1; %从通道进入拣选通道或从拣选通道进入通道需要行走的距离,1LU
adjacent_location=1; %同一条拣选通道的两个相邻储位之间的距离,1LU
adjacent_aisle=5; %两个相邻拣选通道的距离,5LUs
aisle_num=10; %拣选通道数目
side_num=15; %每条拣选通道一侧的储位数目
capacity=100; %设备最大装载量,单位kg
%% 订单数据数据初始化
orders_num=20; %订单数目
batches_maxnum=10; %允许分批的最大数目
%% 萤火虫算法参数初始化
MAXGEN=100; %最大迭代次数
NIND=50; %萤火虫数目
N=batches_maxnum+orders_num-1; %编码长度
alpha=2000; %违反设备装载量约束的惩罚因子
gama=0.95; %光吸收系数
%% 初始化
Population=init_pop(NIND,N); %随机初始化
best_firefly=Population(1,:); %初始全局最优
[batches,batches_num,bestTD,violate_batch,violate_order]=decode(best_firefly,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
disp(['初始订单分批数目:',num2str(batches_num),',总行驶距离:',num2str(bestTD),...
',违反约束订单分批数目:',num2str(violate_batch),',违反约束订单数目:',num2str(violate_order)]);
best_cost=cost_function(batches,orders,item_weight,capacity,side_num,depot_leftAisle,...
enter_leave_aisle,adjacent_location,adjacent_aisle,alpha); %初始全局最优分批方案的总行驶距离
Best_Cost=zeros(MAXGEN,1); %记录每一次迭代全局最优总距离
Best_TD=zeros(MAXGEN,1); %记录每一次迭代全局最优总距离
%% 主循环
gen=1;
while gen<&#61;MAXGEN
%% 计算种群目标函数值
Obj&#61;obj_function(Population,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);
%% 更新萤火虫位置
for i&#61;1:NIND
Individual1&#61;Population(i,:); %第i个萤火虫
for j&#61;1:NIND
Individual2&#61;Population(j,:); %第j个萤火虫
%如果第j个萤火虫发光强度更大&#xff0c;则需要将第i个萤火虫向第j个萤火虫靠近
if Obj(j,1)<Obj(i,1)
rij&#61;cal_rij(Individual1,Individual2); %计算两个萤火虫之间的距离
cross_len&#61;randi([1,ceil(rij*gama^gen)],1,1); %计算交叉片段长度
[Individual1,Individual2]&#61;crossover(Individual1,Individual2,cross_len); %交叉操作&#xff0c;得到新的第i个萤火虫
newObj1&#61;obj_function(Individual1,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);%交叉后得到的新萤火虫
if newObj1<Obj(i,1)
Population(i,:)&#61;Individual1; %更新新种群第i个萤火虫位置
Obj(i,1)&#61;newObj1;
%更新新种群中第i个萤火虫的目标函数值
end
end
end
end
%% 从更新后的Population中选择目标函数值在前10%的个体
offspring&#61;select(Population,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);
%% 局部搜索
offspring&#61;local_search(offspring,orders,batches_maxnum,orders_num,capacity,item_weight,alpha,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
%% 将局部搜索后的offspring与原来的Population进行合并
Population&#61;merge(Population,offspring,Obj);
%% 找到全局最优的萤火虫
Obj&#61;obj_function(Population,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);
[min_Obj,min_index]&#61;min(Obj); %排在第1位的是最小目标函数值
if min_Obj<best_cost
best_firefly&#61;Population(min_index,:); %更新全局最优萤火虫
best_cost&#61;min_Obj;
end
Best_Cost(gen,1)&#61;best_cost; %记录每次迭代全局最优目标函数值
%% 打印
[best_batches,batches_num,bestTD,violate_batch,violate_order]&#61;decode(best_firefly,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
disp([&#39;第&#39;,num2str(gen),&#39;代全局最优萤火虫订单分批数目&#xff1a;&#39;,num2str(batches_num),&#39;&#xff0c;总行驶距离&#xff1a;&#39;,num2str(bestTD),...
&#39;&#xff0c;违反约束订单分批数目&#xff1a;&#39;,num2str(violate_batch),&#39;&#xff0c;违反约束订单数目&#xff1a;&#39;,num2str(violate_order)]);
%% 记录全局最优总行走距离
Best_TD(gen,1)&#61;bestTD;
%% 计数器加1
gen&#61;gen&#43;1;
end
%% 输出优化过程图
figure;
plot(Best_TD,&#39;LineWidth&#39;,1);
title(&#39;优化过程&#39;)
xlabel(&#39;迭代次数&#39;);
ylabel(&#39;拣选总行走距离&#39;);
%% 将全局最优萤火虫解码为订单分批方案
[best_batches,best_num,bestTD]&#61;decode(best_firefly,orders,batches_maxnum,orders_num,capacity,item_weight,...
side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
toc
![](https://img6.php1.cn/3cdc5/9fdb/525/228c33590b490a6c.jpeg)
![](https://img6.php1.cn/3cdc5/9fdb/525/bea4943bcb30533a.jpeg)
最优解:
车辆使用数目&#xff1a;3&#xff0c;车辆行驶总距离&#xff1a;173.4115&#xff0c;违反约束路径数目&#xff1a;0&#xff0c;违反约束顾客数目&#xff1a;0
配送路线1&#xff1a;0->10->11->9->6->4->2->1->0
配送路线2&#xff1a;0->13->15->14->12->0
配送路线3&#xff1a;0->5->3->7->8->0
历时 17.533005 秒。
如需帮助请私聊